package com.superpai.utils;

import java.io.IOException;

import sun.misc.BASE64Encoder;

/**
 * @author Devin.Hu
 * @date 2011-8-12
 * @version V1.0
 * @description base64编码解码工具类
 */
public class Base64Util {
	
	public static void main(String[] args) {
		byte[] arrByte = new byte[1];
		arrByte[0] = 0;
		System.out.println("Dict:");
		for (byte i = 0; i < 64; i++) {
			System.out.print(String.format("%2d %c\t", i,
					Base64Util.encode(arrByte).charAt(0)));
			arrByte[0] += 4;
			if ((i + 1) % 8 == 0) {
				System.out.println("");
			}
		}
		System.out.print(Base64Util.encode("12334jjgfddgh".getBytes()));
	}

	/**
	 * 将二进制内容编码为base64字符串
	 * 
	 * @param srcContent 
	 * @return String 
	 */
	public static String encode(byte[] srcContent) {
		if (srcContent == null) {
			return null;
		}
		// sun的实现会每76个字符后面增加一个回车，需要删除。
		return new BASE64Encoder().encode(srcContent).replace("\r\n", "");
	}

	/**
	 * 将二进制内容编码为可以作URL参数的字符串行
	 *  由于默认base64字典中的+和=在URL参数中，都有特殊的含义，
	 *  需要做转义 将+转义为-将=转义为~
	 * 
	 * @param srcContent 
	 * @return String 
	 */
	public static String encodeURLParam(byte[] srcContent) {
		return encode(srcContent).replace('+', '-').replace('=', '~');
	}

	/**
	 * 将base64字符串解码为源数据内容 与encode互为相逆的过程
	 * 
	 * @param base64Code 
	 * @return byte[] 
	 */
	public static byte[] decode(String base64Code) {
		if (base64Code == null) {
			return null;
		}

		try {
			return new sun.misc.BASE64Decoder().decodeBuffer(base64Code);
		} catch (IOException exception) {
			return null;
		}
	}

	/**
	 * 将base64字符串解码为源数据内容 与encodeURLParam互为相逆的过程
	 * 
	 * @param base64Code 
	 * @return byte[] 
	 */
	public static byte[] decodeURLParam(String base64Code) throws IOException {
		return decode(base64Code.replace('-', '+').replace('~', '='));
	}
}
